/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Ventas.DAO;


import com.dp1.pucp.Modelo.Clases.Precio;
import com.dp1.pucp.Modelo.Clases.Cliente;
import com.dp1.pucp.Modelo.Clases.Documentoventa;
import com.dp1.pucp.Modelo.Clases.Lineapedidoproducto;
import com.dp1.pucp.Modelo.Clases.Pedidoproducto;
import com.dp1.pucp.Modelo.Clases.Presentacion;
import com.dp1.pucp.Modelo.Clases.Productofinal;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Util.HibernateUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;

import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Lucia
 */
public class PedidoProdDAO {
   
     public Pedidoproducto guardarPedidoProd(Pedidoproducto pedidoProd){
         Pedidoproducto c = new Pedidoproducto();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        try {
            session.saveOrUpdate(pedidoProd);
            session.flush();
         
        }catch(HibernateException e) {
            throw new HibernateException(e);
        } finally {
            
            session.persist(pedidoProd);
            
            int cod = pedidoProd.getIdpedidoproducto();
            
            List lista = session.createQuery("from Pedidoproducto where idpedidoproducto="+cod).list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                c = (Pedidoproducto) iter.next();
            }        
            tx.commit();
            session.close();
            return c;
        }
        
    }
    
     public void eliminarLineaPedidoProd (Lineapedidoproducto linea){
         Session session = HibernateUtil.getSessionFactory().openSession();
         Transaction tx = session.beginTransaction();
         try{
             session.delete(linea);
             session.flush();
             tx.commit();
         } catch (HibernateException e){
             throw new HibernateException(e);
             
         }finally{
             session.close();
         }
     }
     
       public void guardarLineaPedidoProd(Lineapedidoproducto linea){
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        try {
            session.saveOrUpdate(linea);
                    session.flush();
            tx.commit();
        }catch(HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();            
        }        
    }
     
     public ArrayList<Tipoproducto> listarProductos(){
         ArrayList<Tipoproducto> listaResultados = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Tipoproducto where tipo='PF' order by idtipoproducto").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Tipoproducto c = (Tipoproducto) iter.next();
                Hibernate.initialize(c.getIdtipoproducto());
                Hibernate.initialize(c.getNombre());
                Hibernate.initialize(c.getTipo());
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
         
     }
     
     public ArrayList<Presentacion> listarPresentaciones(){
         ArrayList<Presentacion> listaPresentaciones = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Presentacion order by idpresentacion").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Presentacion c = (Presentacion) iter.next();
                Hibernate.initialize(c.getIdpresentacion());
                Hibernate.initialize(c.getNombre());
                listaPresentaciones.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaPresentaciones;
        }      
     }
     
     public ArrayList<Cliente> listarClientes(){
         ArrayList<Cliente> listaClientes = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Cliente order by idcliente").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Cliente c = (Cliente) iter.next();
                Hibernate.initialize(c.getIdcliente());
                Hibernate.initialize(c.getRazonsocial());
                listaClientes.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaClientes;
        }     
     }
    
     
     public ArrayList<Cliente> listarClientesxNombre(String nombre, int codigo){
         ArrayList<Cliente> listaClientes = new ArrayList<>();
         Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista;
            lista = session.createQuery("from Cliente where razonsocial like '%"+nombre+"%' order by idcliente").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Cliente c = (Cliente) iter.next();
                Hibernate.initialize(c.getIdcliente());
                Hibernate.initialize(c.getRazonsocial());
                listaClientes.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaClientes;
        }     
     }

   


    public ArrayList<String> listarEstado() 
    {
        ArrayList<String> estados = new ArrayList<>();
        estados.add("Cancelada"); //0
        estados.add("Registrada"); //1
        estados.add("En Compra"); //2
        estados.add("En Produccion"); //3
        estados.add("Finalizada"); //4
        estados.add("Finalizada y Entregada"); //5
        return estados;
    }
    
    public ArrayList<Lineapedidoproducto> listarLineasPedidoProd(Pedidoproducto pedido){
        ArrayList<Lineapedidoproducto> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Lineapedidoproducto where idpedidoproducto="+pedido.getIdpedidoproducto()+" order by idpedidoproducto").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Lineapedidoproducto l = (Lineapedidoproducto) iter.next();
                Hibernate.initialize(l.getIdlineapedidoproducto());
                Hibernate.initialize(l.getTipoproducto());
                Hibernate.initialize(l.getTipoproducto().getIdtipoproducto());
                Hibernate.initialize(l.getTipoproducto().getNombre());
                Hibernate.initialize(l.getCantidad());
                Hibernate.initialize(l.getPUnitario());
                Hibernate.initialize(l.getPresentacion());
                Hibernate.initialize(l.getPresentacion().getIdpresentacion());
                Hibernate.initialize(l.getPresentacion().getNombre());
                Hibernate.initialize(l.getSubtotal());
                Hibernate.initialize(l.getPedidoproducto());
                Hibernate.initialize(l.getPedidoproducto().getIdpedidoproducto());
             
                listaResultados.add(l);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
    public ArrayList<Pedidoproducto> listarPedidoProdEstado(int estadoPedidoProd){
    ArrayList<Pedidoproducto> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Pedidoproducto where motivo="+"'Por Politica'"+"order by idpedidoproducto").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Pedidoproducto c = (Pedidoproducto) iter.next();
                Hibernate.initialize(c.getIdpedidoproducto());
                Hibernate.initialize(c.getTotal());
                Hibernate.initialize(c.getCliente());
                Hibernate.initialize(c.getCliente().getIdcliente());
                Hibernate.initialize(c.getCliente().getRazonsocial());
                Hibernate.initialize(c.getFechaRegistro());
                Hibernate.initialize(c.getFechaEntrega());
                Hibernate.initialize(c.getLineapedidoproductos());
               
                
                
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }    
    
    public ArrayList<Pedidoproducto> listarPlanProdEstado(int estadoPedidoProd){
    ArrayList<Pedidoproducto> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Pedidoproducto where motivo="+"'Venta'"+"order by idpedidoproducto").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Pedidoproducto c = (Pedidoproducto) iter.next();
                Hibernate.initialize(c.getIdpedidoproducto());
               // Hibernate.initialize(c.getTotal());
               // Hibernate.initialize(c.getCliente());
               // Hibernate.initialize(c.getCliente().getIdcliente());
               // Hibernate.initialize(c.getCliente().getRazonsocial());
                Hibernate.initialize(c.getFechaRegistro());
               // Hibernate.initialize(c.getFechaEntrega());
                Hibernate.initialize(c.getLineapedidoproductos());
               
                
                
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }    
    
    
    
    public ArrayList<Pedidoproducto> listarPedidoProd(int estadoPedidoProd, int codigo){
    ArrayList<Pedidoproducto> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista;
            String motivo = "'Venta'";
            if (codigo == 0) { // todos los codigos
                //por estado
                lista = session.createQuery("from Pedidoproducto where estado=" + estadoPedidoProd + "and motivo="+motivo+" order by idpedidoproducto").list();

            } else { // por codigo
                //por estado
                lista = session.createQuery("from Pedidoproducto where idpedidoproducto=" + codigo + " and estado=" + estadoPedidoProd + " and motivo="+motivo+" order by idpedidoproducto").list();
            }




            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Pedidoproducto c = (Pedidoproducto) iter.next();
                Hibernate.initialize(c.getIdpedidoproducto());
                Hibernate.initialize(c.getTotal());
                Hibernate.initialize(c.getCliente());
                Hibernate.initialize(c.getCliente().getIdcliente());
                Hibernate.initialize(c.getCliente().getRazonsocial());
                Hibernate.initialize(c.getFechaRegistro());
                Hibernate.initialize(c.getFechaEntrega());
                Hibernate.initialize(c.getLineapedidoproductos());

                listaResultados.add(c);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    public ArrayList<Pedidoproducto> listarPlanProd(int estadoPedidoProd, int codigo){
    ArrayList<Pedidoproducto> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista;
            String motivo = "'Por Politica'";
            if (codigo == 0) { // todos los codigos
                //por estado
                lista = session.createQuery("from Pedidoproducto where estado=" + estadoPedidoProd + "and motivo="+motivo+" order by idpedidoproducto").list();

            } else { // por codigo
                //por estado
                lista = session.createQuery("from Pedidoproducto where idpedidoproducto=" + codigo + " and estado=" + estadoPedidoProd + "and motivo="+motivo+" order by idpedidoproducto").list();
            }




            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Pedidoproducto c = (Pedidoproducto) iter.next();
                Hibernate.initialize(c.getIdpedidoproducto());
//                Hibernate.initialize(c.getTotal());
//                Hibernate.initialize(c.getCliente());
//                Hibernate.initialize(c.getCliente().getIdcliente());
//                Hibernate.initialize(c.getCliente().getRazonsocial());
                Hibernate.initialize(c.getFechaRegistro());
//                Hibernate.initialize(c.getFechaEntrega());
                Hibernate.initialize(c.getLineapedidoproductos());



                listaResultados.add(c);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    
         
    public Float getPrecioProducto(int cod) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Precio p = new Precio();
            List lista = session.createQuery("from Precio where idtipoproducto=" + cod).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                p = (Precio) iter.next();
            }
            tx.commit();

            return p.getPrecio();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }
    
        
     public Presentacion getPresentacion(int cod) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Presentacion p = new Presentacion();
            List lista = session.createQuery("from Presentacion where idpresentacion=" + cod).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                p = (Presentacion) iter.next();
            }
            tx.commit();

            return p;
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }
     
         
        
     public Tipoproducto getTipoProducto(int cod) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Tipoproducto p = new Tipoproducto();
            List lista = session.createQuery("from Tipoproducto where idtipoproducto=" + cod).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                p = (Tipoproducto) iter.next();
            }
            tx.commit();

            return p;
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }
     
     
      public Productofinal getProductoFinal(int idtipoproducto, int idpresentacion) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Productofinal p = new Productofinal();
            List lista = session.createQuery("from Productofinal where idtipoproducto=" + idtipoproducto+" and idpresentacion ="+idpresentacion).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                p = (Productofinal) iter.next();
            }
            tx.commit();

            return p;
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }
    
    public ArrayList<Documentoventa> listarDocVentas(int estado, int codigo){
        
        ArrayList<Documentoventa> listaResultados = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista ;
            
            if (estado ==0){ //todos los estados
                if (codigo==0) {//todos los codigos
                    lista= session.createQuery("from Documentoventa ").list();
                }
                else { //por codigo
                    lista= session.createQuery("from Documentoventa where iddocumentoventa="+codigo).list();
                }
            }else{ //por estado
                estado = estado-1;
                if (codigo==0) {//todos los codigo
                    lista= session.createQuery("from Documentoventa where estado="+estado).list();
                }
                else { //por codigo
                    lista= session.createQuery("from Documentoventa where iddocumentoventa="+codigo+" and estado= "+estado).list();
                }
            }
            
            
           Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Documentoventa dv = (Documentoventa) iter.next();
                Hibernate.initialize(dv.getIddocumentoventa());
                Hibernate.initialize(dv.getCliente());                
                Hibernate.initialize(dv.getCliente().getIdcliente());                
                Hibernate.initialize(dv.getCliente().getRazonsocial());                
                Hibernate.initialize(dv.getEstado());                
                Hibernate.initialize(dv.getFechaemision());               
                Hibernate.initialize(dv.getFechapago());             
                Hibernate.initialize(dv.getPedidoproducto());
                Hibernate.initialize(dv.getPedidoproducto().getIdpedidoproducto());
                listaResultados.add(dv);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }
    
}